home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / kernel / noklick1.1 < prev    next >
Text File  |  1988-11-02  |  4KB  |  159 lines

  1. Path: xanth!nic.MR.NET!tank!mimsy!dftsrv!ames!ncar!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i039:  noklickstart - stop some empty A1000 drives from klicking v1.3 (REPOST)
  5. Message-ID: <9997@swan.ulowell.edu>
  6. Date: 2 Nov 88 05:38:43 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 147
  9. Approved: page@swan.ulowell.edu
  10. Supersedes: <9945@swan.ulowell.edu>
  11.  
  12. Submitted-by: page@swan.ulowell.edu (Bob Page)
  13. Posting-number: Volume 2, Issue 39
  14. Archive-name: kernel/noklick13.1
  15.  
  16. [I goofed - forgot to flush the track buffer.  See text in comp.sys.amiga.
  17. If you have the original, don't use it, use this version.  Sorry!  ..Bob]
  18.  
  19. #    This is a shell archive.
  20. #    Remove everything above and including the cut line.
  21. #    Then run the rest of the file through sh.
  22. #----cut here-----cut here-----cut here-----cut here----#
  23. #!/bin/sh
  24. # shar:    Shell Archiver
  25. #    Run the following text with /bin/sh to create:
  26. #    noklick.c
  27. # This archive created: Wed Nov  2 00:20:46 1988
  28. cat << \SHAR_EOF > noklick.c
  29. /* noKlickStart for 1.3 - version 2! */
  30. /* Bob Page - Nov 1 1988 */
  31.  
  32. /* the first version didn't flush the track buffer ... mea culpa. */
  33.  
  34. /* thanks to Bryce Nesbitt for writing noKlickStart for 1.2 */
  35.  
  36. #include <exec/memory.h>
  37. #include <devices/trackdisk.h>
  38. #include <libraries/dos.h>
  39. #include <libraries/dosextens.h>
  40. #include <stdio.h>
  41.  
  42. struct MsgPort *diskport = NULL;        /* Port for trackdisk replies */
  43. struct MsgPort *CreatePort();
  44. struct IOExtTD *diskreq = NULL;         /* Pointer for extended disk commands */
  45. struct IORequest *CreateExtIO();
  46. void   *AllocMem();
  47. ULONG  *buf;
  48.  
  49. #ifdef AZTEC_C
  50. _cli_parse() {}
  51. _wb_parse() {}
  52. #endif
  53.  
  54. main()
  55. {
  56.     char s[2];
  57.  
  58.     puts("noKLICKstart V1.3");
  59.     puts("Use this on a backup of your V1.3 Kickstart disk.\n");
  60.     puts("Insert Kickstart into drive DF0:.  Type y then RETURN");
  61.     fputs("to continue, or just RETURN to abort. ->  ", stdout);
  62.  
  63.     gets(s);
  64.     if (s[0] != 'y') exit(10);
  65.  
  66.     diskport = CreatePort(0L,0L);
  67.     diskreq = (struct IOExtTD *) CreateExtIO(diskport,sizeof(struct IOExtTD));
  68.     OpenDevice("trackdisk.device", 0L, diskreq, 0L);
  69.     buf = (ULONG *) AllocMem(512L, MEMF_CHIP);
  70.  
  71.     diskreq->iotd_Req.io_Length = 0L;
  72.     diskreq->iotd_Req.io_Command = TD_PROTSTATUS;
  73.     diskreq->iotd_Req.io_Offset = 0L;
  74.     DoIO(diskreq);
  75.     if(diskreq->iotd_Req.io_Actual) {
  76.     puts("noKLICKstart failed.  Perhaps your disk is write protected?");
  77.     leave(10);
  78.     }
  79.  
  80.     if ((GetBlock(512L, buf))) {
  81.     puts("\nnoKLICKstart failed.  Couldn't read the disk.");
  82.     leave(10);
  83.     }
  84.  
  85.     if(buf[122] != 0x15267db3) WrongVer(1);
  86.     buf[122] = 0x14a67db3;
  87.     PutBlock(512L, buf);
  88.  
  89.     GetBlock(332L, buf);
  90.     if(buf[26] != 0x086b0001) {        /* BCHG */
  91.     WrongVer(0);
  92.     GetBlock(512L, buf);
  93.     buf[122] =  0x15267db3;        /* restore checksum */
  94.     PutBlock(512L, buf);
  95.     leave(10);
  96.     }
  97.     buf[26] = 0x08eb0001;        /* BSET */
  98.     PutBlock(332L, buf);
  99.  
  100.     diskreq->iotd_Req.io_Command = CMD_UPDATE;
  101.     DoIO(diskreq);            /* flush the track buffer */
  102.  
  103.     puts("\nnoKLICKstart installed.  Please perform a cold boot now.\n");
  104.     leave(0);
  105. }
  106.  
  107.  
  108. GetBlock(num, diskbuf)
  109. ULONG num;
  110. ULONG *diskbuf;
  111. {
  112.     diskreq->iotd_Req.io_Length = 512L;
  113.     diskreq->iotd_Req.io_Data = (APTR) diskbuf;
  114.     diskreq->iotd_Req.io_Command = CMD_READ;
  115.     diskreq->iotd_Req.io_Offset = num*512L;
  116.     return(DoIO(diskreq));
  117. }
  118.  
  119.  
  120. PutBlock(num, diskbuf)
  121. ULONG num;
  122. ULONG *diskbuf;
  123. {
  124.     diskreq->iotd_Req.io_Length = 512L;
  125.     diskreq->iotd_Req.io_Data = (APTR) diskbuf;
  126.     diskreq->iotd_Req.io_Command = CMD_WRITE;
  127.     diskreq->iotd_Req.io_Offset = num*512L;
  128.     return(DoIO(diskreq));
  129. }
  130.  
  131.  
  132. leave(n)
  133. int n;
  134. {
  135.     diskreq->iotd_Req.io_Length = 0L;
  136.     diskreq->iotd_Req.io_Command = TD_MOTOR;
  137.     DoIO(diskreq);
  138.     FreeMem(buf, 512L);
  139.     CloseDevice(diskreq);
  140.     DeleteExtIO(diskreq, sizeof(struct IOExtTD));
  141.     DeletePort(diskport);
  142.  
  143.     exit(n);
  144. }
  145.  
  146.  
  147. WrongVer(f)
  148. int f;
  149. {
  150. puts("\nYou can't fool me! :-)  That's not an unmodified V1.3 (34.5) Kickstart!!");
  151. if (f) leave(10);
  152. }
  153. SHAR_EOF
  154. #    End of shell archive
  155. exit 0
  156. -- 
  157. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  158. Have five nice days.
  159.